package main

import "fmt"

func test(char byte) byte {
	return char + 1
}

func main() {
	/*
		案例：
		请编写一个程序，该程序可以接收一个字符，比如: a,b,c,d,e,f,g
		a表示星期一，b表示星期二....根据用户的输入显示相依的信息.

		分析思路
		1.定义一个变量接收字符
		2.使用switch完成
	*/
	/* var key byte
	fmt.Println("请输入a,b,c,d,e,f,g中的一个字符")
	// fmt.Scanln(&key)			// 会转换类型 不会得到对应的字符类型
	fmt.Scanf("%c", &key)

	switch test(key) {
	case 'a':
		fmt.Println("今天是星期一")
	case 'b':
		fmt.Println("今天是星期二")
	case 'c':
		fmt.Println("今天是星期三")
	case 'd':
		fmt.Println("今天是星期四")
	case 'e':
		fmt.Println("今天是星期五")
	case 'f':
		fmt.Println("今天是星期六")
	case 'g':
		fmt.Println("今天是星期天")
	default:
		fmt.Println("输入不正确")
	} */

	/* var n1 int32 = 5
	var n2 int32 = 20
	var n3 int32 = 5

	switch n1 {
	// case n2: // 错误：原因是 n2的数据类型和n1不一致
	case n2, 10, 5: // case 后面可以有多个表达式
		fmt.Println("ok1")
	case n3 :			// 变量可以重复
		fmt.Println("ok2~")
	case 5 ：			// 常量（字面量）不能重复
		fmt.Println("ok3~")
	default:
		fmt.Println("没有匹配到")
	} */

	/* var age int = 10

	switch {
	case age == 10:
		fmt.Println("age == 10")
	case age == 20:
		fmt.Println("age == 20")
	default:
		fmt.Println("没有匹配到")
	} */

	// case 中也可以对age 范围进行判断
	/* var score int = 30

	switch {
	case score > 90:
		fmt.Println("成绩优秀")
	case score >= 70 && score <= 90:
		fmt.Println("成绩优良")
	case score >= 60 && score < 70:
		fmt.Println("成绩及格")
	default:
		fmt.Println("不及格")
	} */

	// switch后也可以直接声明/定义一个变量，分号结束，不推荐
	/* switch grade := 30; {
	case grade > 90:
		fmt.Println("成绩优秀")
	case grade >= 70 && grade <= 90:
		fmt.Println("成绩优良")
	case grade >= 60 && grade < 70:
		fmt.Println("成绩及格")
	default:
		fmt.Println("不及格")
	} */

	// 游戏升级	升到第10级会把前9级的奖励都包含 这里会用到
	// switch穿透-fallthrough，如果在case语句块后增加fallthrough ,则会继续执行下一个case,也叫switch穿透。
	var num int = 10

	switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough // 默认只能穿透一层
	case 20:
		fmt.Println("ok2")
	case 30:
		fmt.Println("ok3")
	default:
		fmt.Println("没有匹配到")
	}

	var x interface{}
	var y = 10.0
	x = y
	switch i := x.(type) {
	case nil:
		fmt.Printf("x 的类型是：%T", i)
	case int:
		fmt.Printf("x 的类型是：%T", i)
	case float64:
		fmt.Printf("x 的类型是：%T", i)
	case func(int) float64:
		fmt.Printf("x 的类型是：%T", i)
	case bool, string:
		fmt.Printf("x 的类型是：%T", i)
	default:
		fmt.Printf("x 的类型是未知型")
	}
}
